Skip to content

A pegged knob gets room, and the exe stops looking packed - #28

Merged
JIRPOS merged 2 commits into
masterfrom
peg-growth-and-unpacked-assets
Aug 10, 2026
Merged

A pegged knob gets room, and the exe stops looking packed#28
JIRPOS merged 2 commits into
masterfrom
peg-growth-and-unpacked-assets

Conversation

@JIRPOS

@JIRPOS JIRPOS commented Aug 10, 2026

Copy link
Copy Markdown
Owner

Release notes

CHANGED: A range slider's knob dragged hard against either end now comes back with room to keep
going, instead of sticking to the corner and having to be dragged past the track again.

CHANGED: On a filter whose numbers have decimals, pegging a knob no longer flings it most of the
way across the track.

CHANGED: The Windows executable no longer packs its fonts and icon into compressed blobs it
unpacks at startup, and now declares itself to Windows the way a normal application does — both
to reduce the chance Microsoft Defender flags the unsigned download as malware.

Review notes

Microsoft's cloud classifier scored an unsigned release as Trojan:Win32/Wacatac.B!ml — one
verdict out of seventy-one engines, the shape of a false positive. Until the binaries are signed
the answer is a set of cheap signals, each defensible on its own terms. The complementary half is
a WDSI false-positive report per release, which is not code and is not in here.

ADDED: An application manifest, declaring asInvoker and the standard supportedOS block.

  • It declares no DPI awareness on purpose: SDL sets that at video init, and taking the decision
    away from SDL would move the overlay on a high-DPI display.

ADDED: /guard:cf on MSVC builds.

  • /CETCOMPAT is deliberately not here: it is a promise about the whole image, statically linked
    SDL, curl and zlib included, and a wrong one crashes rather than degrading.

ADDED: scripts/bin2c.py, which all three embedded assets now go through.

CHANGED: The range slider's track grows past where the knob was left, not past the end it was
pushed through.

  • A drag does not stop at the end, so a pegged bound sits out in the overshoot and the domain
    widens to hold it regardless; a fifth added to the old end landed inside that, and the knob came
    to rest against the very corner it had just been pushed through. This is why the gesture read as
    doing nothing at all.

CHANGED: The growth floor is one step at the row's own precision rather than a flat 1.

  • On an attack speed's 1.30 to 1.45 a flat 1 grew the track sevenfold in a single release and
    left the knob 87% of the way across it.

CHANGED: Only the bound that was dragged grows the track, not one carried to an end by the other
knob crossing it — which is what the comment above it already claimed.

CHANGED: The fonts, the UI glyphs and the icon are embedded as their own bytes instead of
base85-encoded, stb_compress'd blobs.

  • An opaque high-entropy blob beside a routine that decodes it into a fresh buffer is a packer's
    shape. Unpacked, .rdata holds a TTF table directory and a PNG signature instead.
  • The executable comes out ~21KB smaller regardless: the icon sheds 34KB, the four faces add 13KB.
    src/fontin_data.inc grows to 653KB of generated source, which is the real cost.
  • ImGui is told FontDataOwnedByAtlas = false for the embedded faces, as it already was for
    mapped ones. That config must never reach AddFontFromFileTTF, which allocates its own buffer
    and would then leak it.

CHANGED: The embedded icon is the 128px master downscaled to 64.

  • It is only ever drawn at tray size or as a window icon; the master stays the source of the .ico,
    where the big entries are the ones Explorer uses.

REMOVED: The base85 decoder in src/icon.cpp, and the font scripts' dependency on a configured
build tree for ImGui's binary_to_compressed_c.cpp.


Tested: suite green (19/19); Settings and the idle marker captured on Xvfb, so all four Fontin
faces and the glyph subset are confirmed rendering from the new arrays and the icon loads without
complaint. The slider's peg-growth was verified by replaying the release-frame arithmetic rather
than by driving a drag — the widget has no test coverage, since it needs ImGui and ppc_core links
none — so it wants a hands-on check in game before this ships. The manifest and /guard:cf are
Windows-only and unbuildable here; CI is the check on those.

🤖 Generated with Claude Code

JIRPOS added 2 commits August 10, 2026 03:31
CHANGED: The track now grows past where the knob was left, not past the end it was pushed through.

- A drag does not stop at the end, so a pegged bound sits out in the overshoot and the domain
  widens to hold it regardless; a fifth added to the old end landed inside that, and the knob came
  to rest against the very corner it had just been pushed through.

CHANGED: The growth floor is one step at the row's own precision rather than a flat 1.

- On an attack speed's `1.30 to 1.45` a flat 1 grew the track sevenfold in a single release and
  left the knob 87% of the way across it.

CHANGED: Only the bound that was dragged grows the track, not one carried to an end by the other
knob crossing it — which is what the comment above it already claimed.
Microsoft's cloud classifier scored an unsigned release as Trojan:Win32/Wacatac.B!ml — one verdict
out of seventy-one engines. Until the binaries are signed the answer is a set of cheap signals,
each of which is defensible on its own terms.

ADDED: An application manifest, declaring `asInvoker` and the standard `supportedOS` block.

- It declares no DPI awareness on purpose: SDL sets that at video init, and taking the decision
  away from SDL would move the overlay on a high-DPI display.

ADDED: `/guard:cf` on MSVC builds.

- `/CETCOMPAT` is deliberately not here: it is a promise about the whole image, statically linked
  SDL, curl and zlib included, and a wrong one crashes rather than degrading.

ADDED: `scripts/bin2c.py`, which all three embedded assets now go through.

CHANGED: The fonts, the UI glyphs and the icon are embedded as their own bytes instead of
base85-encoded, stb_compress'd blobs.

- An opaque high-entropy blob beside a routine that decodes it into a fresh buffer is a packer's
  shape. Unpacked, `.rdata` holds a TTF table directory and a PNG signature instead.
- The executable comes out ~21KB smaller regardless: the icon sheds 34KB, the four faces add 13KB.
  `src/fontin_data.inc` grows to 653KB of generated source, which is the real cost.

CHANGED: The embedded icon is the 128px master downscaled to 64.

- It is only ever drawn at tray size or as a window icon; the master stays the source of the .ico,
  where the big entries are the ones Explorer uses.

REMOVED: The base85 decoder in `src/icon.cpp`, and the font scripts' dependency on a configured
build tree for ImGui's `binary_to_compressed_c.cpp`.
@JIRPOS
JIRPOS merged commit bb95617 into master Aug 10, 2026
4 checks passed
@JIRPOS
JIRPOS deleted the peg-growth-and-unpacked-assets branch August 10, 2026 01:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant